// Copyright Epic Games, Inc. All Rights Reserved.

#include "LyraActionWidget.h"

#include "CommonInputBaseTypes.h"
#include "CommonInputSubsystem.h"
#include "Engine/LocalPlayer.h"
#include "EnhancedInputSubsystems.h"

/**
 * 重写父类函数，获取当前显示的图标
 * 优先返回与关联输入动作绑定的键的图标，若没有则返回父类默认图标
 */
FSlateBrush ULyraActionWidget::GetIcon() const
{
	// 如果此控件有关联的增强输入动作，则搜索绑定到该动作的任何键并显示这些键的图标，而不是使用默认数据表设置
	// 这覆盖了玩家将键重新绑定到其他内容的情况
	if (AssociatedInputAction)
	{
		// 获取增强输入子系统
		if (const UEnhancedInputLocalPlayerSubsystem* EnhancedInputSubsystem = GetEnhancedInputSubsystem())
		{
			// 查询映射到该动作的所有键
			TArray<FKey> BoundKeys = EnhancedInputSubsystem->QueryKeysMappedToAction(AssociatedInputAction);
			FSlateBrush SlateBrush; // 定义画刷

			// 获取通用输入子系统
			const UCommonInputSubsystem* CommonInputSubsystem = GetInputSubsystem();
			// 如果存在绑定的键，并且成功获取了对应输入类型的画刷
			if (!BoundKeys.IsEmpty() && CommonInputSubsystem && UCommonInputPlatformSettings::Get()->TryGetInputBrush(SlateBrush, BoundKeys[0], CommonInputSubsystem->GetCurrentInputType(), CommonInputSubsystem->GetCurrentGamepadName()))
			{
				// 返回绑定键的图标画刷
				return SlateBrush;
			}
		}
	}
	
	// 回退到父类的默认图标获取逻辑
	return Super::GetIcon();
}

/**
 * 获取增强输入本地玩家子系统
 * @return 返回绑定控件或自身所属本地玩家的子系统，失败返回nullptr
 */
UEnhancedInputLocalPlayerSubsystem* ULyraActionWidget::GetEnhancedInputSubsystem() const
{
	// 获取绑定控件
	const UWidget* BoundWidget = DisplayedBindingHandle.GetBoundWidget();
	// 获取绑定控件的所属本地玩家，如果没有则获取自身的所属本地玩家
	if (const ULocalPlayer* BindingOwner = BoundWidget ? BoundWidget->GetOwningLocalPlayer() : GetOwningLocalPlayer())
	{
		// 返回该本地玩家的增强输入子系统
		return BindingOwner->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>();
	}
	// 无法获取本地玩家，返回空指针
	return nullptr;
}